/* eslint-disable no-undef */
import 'whatwg-fetch'
import { csDel } from './cookie'
import { stringify } from 'qs'
import { message as msg } from 'antd'
import apiUrl from '../ApiServer/config'
import { startWith } from './'

//检查原始值得status码
function checkStatus(response) {
  if (response.status >= 200 && response.status < 300) {
    return response
  }
  const error = new Error(response.statusText)
  error.response = response
  throw error
}
//数据转json
function parseJSON(response) {
  return response.json()
}
function whatwgFetch(url, options) {
  return new Promise((resolve, reject) => {
    options.load && msg.loading('加载中...', 0)
    fetch(url, options)
      //检查原始数据状态码
      .then(checkStatus)
      //数据转json
      .then(parseJSON)
      .then(async response => {
        //成功后关闭load
        options.load && msg.destroy()
        return response
      })
      //接口数据res数据
      .then(res => {
        let { status, message } = res
        //判断res.data里的数据类型
        if (typeof status !== 'number') {
          console.log('接口返回的status类型错误！')
        }
        //判断res.data里的数据类型
        if (typeof message !== 'string') {
          console.log('接口返回的message类型错误！')
        }
        //如果是token的问题，页面跳转到登录
        if (Number(status) === 2000) {
          resolve(res) //返回成功数据
        } else {
          if (Number(status) === 1003) {
            csDel('X-AUTH-TOKEN', '/', 'yimifudao.com')
            window.location.href = `/login`
          }
          resolve(res)
        }
      })
      //错误处理
      .catch(error => {
        console.log('接口默认catch', error)
        reject(error)
      })
  })
}
//默认配置
let fetchConfig = {
  //是否有load
  load: true,
  //到cookies信息
  credentials: 'include',
  headers: { 'Content-Type': 'application/json' },
  baseURL: apiUrl.baseURL,
  //默认请求方式
  method: 'get'
}
export default {
  /**
   * get方法
   * @param url 请求地址
   * @param param 参数
   * @param config 配置
   */
  async get(url, param, config) {
    let getParam = param ? `?${stringify(param)}` : ''
    let urlParam = getUrl(url, config)
    return await whatwgFetch(urlParam + getParam, {
      ...fetchConfig,
      ...config
    })
  },
  /**
   * delete方法
   * @param url 请求地址
   * @param param 参数
   * @param config 配置
   */
  async delete(url, param, config) {
    let getParam = param ? `?${stringify(param)}` : ''
    let urlParam = getUrl(url, config)
    return await whatwgFetch(urlParam + getParam, {
      ...fetchConfig,
      method: 'delete',
      ...config
    })
  },
  /**
   * post方法，用于添加
   * @param url 请求地址
   * @param param 参数
   * @param config 配置
   */
  async post(url, param, config) {
    let urlParam = getUrl(url, config)
    return await whatwgFetch(urlParam, {
      ...fetchConfig,
      method: 'post',
      body: JSON.stringify(param),
      ...config
    })
  },
  /**
   * put方法,用于编辑
   * @param url 请求地址
   * @param param 参数
   * @param config 配置
   */
  async put(url, param, config) {
    let urlParam = getUrl(url, config)
    return whatwgFetch(urlParam, {
      ...fetchConfig,
      method: 'put',
      body: JSON.stringify(param),
      ...config
    })
  }
}
/*
额外工具
 */
function getUrl(url, config = fetchConfig) {
  return startWith(url, 'http') || startWith(url, '//') ? url : config.baseURL + url
}
